package com.example.demo.controller;

import com.alibaba.druid.support.http.util.IPAddress;
import com.example.demo.dao.StuJpaDao;
import com.example.demo.entity.Student;
import com.example.demo.server.StuServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/student")
public class JpaController {
    @Resource//自动实例化注解
    StuJpaDao stuJpaDao  ;//学生数据库操作类
    @Resource
    StuServer stuServer;
    @Autowired //Resource
    RedisTemplate redisTemplate;
    /**
     * JPA例子
     **/

    //返回所有学生信息 json格式的方式返回
    //调用方式 http://localhost:8080/student/getAllNameNotNUll
    @GetMapping("/getAllNameNotNUll")
    public List<Student> getAllNameNotNUll() {
//        redisTemplate.opsForValue().set("id::12","sss");可以通过::的方式去区分命名空间和key
        return stuJpaDao.findByNameNotNull();//获取所有学生信息
    }

    //返回指定ID学生信息 json格式的方式返回
    //调用方式 http://localhost:8080/student/getOne
    @GetMapping("/getOne")
//    @Cacheable(cacheNames = "student",key = "#id")//cacheNames 类似一个缓存空间名称，会存着不同的查询条件的结果缓存
    public Student getOne(int id) {
        //先从缓存取数据
        Student student = (Student) redisTemplate.opsForValue().get("id_"+id);
        if(student!=null){//缓存有
            return student;//返回指定ID学生信息
        }else{//缓存没有
            student = stuJpaDao.getOneByNativeQuery(id);//查询数据库
            redisTemplate.opsForValue().set("id_"+student.getId(),student);
//            redisTemplate.delete()
            return student;//返回指定ID学生信息
        }
    }
    //更新指定ID的学生信息
    //调用方式 http://localhost:8080/student/updateJpa?id=1&name=lan
    @GetMapping("/updateJpa")
    public String updateJpa(int id, String name) {
        Student result = stuServer.go(id,name);
        if (result != null) {
            return "更新成功";
        } else {
            return "更新失败";
        }
    }

    //返回指定ID学生信息 JPA自带的 json格式的方式返回
    //调用方式 http://localhost:8080/student/getOneJpa
    @GetMapping("/getOneJpa")
    public Student getOneJpa(int id) {
        return stuJpaDao.findById(id).get();//返回指定ID学生信息
    }




    //插入学生信息，接收前端的三个参数，name，sex classId
    //调用方式 http://localhost:8080/student/insertJpa?name=ss&sex=男&classId=1
    @GetMapping("/insertJpa")
    public String insertJpa(String name, String sex, int classId) {
        Student student = new Student();
        student.setName(name);
        student.setSex(sex);
        student.setClassId(classId);
        Student result = stuJpaDao.save(student);//调用数据库操作类
        if (result != null) {
            return "插入成功";
        } else {
            return "插入失败";
        }
    }

    //更新指定ID的学生信息
    //调用方式 http://localhost:8080/student/updateJpaSql?id=1&name=lan
    @GetMapping("/updateJpaSql")
    public String updateJpaSql(int id, String name) {
        int result = stuJpaDao.updateStu(id,name);
        if (result >0) {
            return "更新成功";
        } else {
            return "更新失败";
        }
    }
    //返回所有学生信息 json格式的方式返回
    //调用方式 http://localhost:8080/student/findAllJpa
    @GetMapping("/findAllJpa")
    public List<Student> findAllJpa() {
        return stuJpaDao.findAll();//获取所有学生信息
    }
    //根据年龄和名称模糊查询
    //调用方式 http://localhost:8080/student/findAllJpaByName
    @GetMapping("/findAllJpaByName")
    @Cacheable(cacheNames = "stuList",key = "'stuList'+#name+#age")//cacheNames 类似一个缓存空间名称，会存着不同的查询条件的结果缓存
    //如果对应的查询条件已经查过数据，表明缓存空间会有对应的数据，直接返回缓存中的数据，不查询数据库
    //否则查询数据库
    public List<Student> findAllJpa1(String name,int age) {
        if(age ==0){
            return stuJpaDao.findByNameContaining(name);//根据学生姓名查询
        }
        return stuJpaDao.findByNameContainingAndAge(name,age);//根据学生姓名和年龄查询
    }
    //返回指定ID学生信息 JPA自带的 json格式的方式返回
    //调用方式 http://localhost:8080/student/deleteJpa
    @GetMapping("/deleteJpa")
    @CacheEvict(cacheNames = "stuList",allEntries = true)
    public String deleteJpa(int id) {
        stuJpaDao.deleteById(id);//返回指定ID学生信息
        return "删除成功";
    }
    //根据年龄范围条件和名称查询
    //调用方式 http://localhost:8080/student/findByNameContainingAndAgeBetween
    @GetMapping("/findByNameContainingAndAgeBetween")
    public List<Student> findByNameContainingAndAgeBetween(String name,int age,int age1) {

        return stuJpaDao.findByNameContainingAndAgeBetween(name,age,age1);//根据学生姓名和年龄查询
    }
    //根据年龄范围条件和名称查询
    //调用方式 http://localhost:8080/findByNameOrName
    @GetMapping("/findByNameOrName")
    public List<Student> findByNameOrName(String name,String name1) {

        return stuJpaDao.findByNameOrNameOrderByAgeDesc(name,name1);//根据学生姓名和年龄查询
    }

    @PostMapping("/uploadFile")
    //id为学生id，file是对应的头像
    public String uploadFile(MultipartFile file,int id) throws IOException {
        String filename = file.getOriginalFilename();//获取上传的文件名称
        String dirPath = "D:\\file\\";//设置保存的文件目录
        File filePath = new File(dirPath);
        if(!filePath.exists()){//表示D:\file是不是存在这个文件夹
            filePath.mkdirs();//不存在就创建对应的文件夹
        }
        File newFile = new File(dirPath+filename);
        file.transferTo(newFile);//将上传的文件保存在D：\file

        //查找对应的学生信息
        Student student = stuJpaDao.findById(id).get();
        //理论上应该是ip地址+端口，images是虚拟路径，是在CORSConf文件夹中设置虚拟路径和实体路径的映射
//        String ip = Add
        student.setTouxiang("http://localhost:8080/images/"+filename);//把新头像设置到学生信息里面
        stuJpaDao.save(student);
        return "上传成功";
    }


}
